"""
指标计算服务
整合 K 线数据获取和技术指标计算
"""

from typing import Dict, Any, Optional
from datetime import datetime, timedelta
from .binance_client import BinanceDataClient
from .indicators import calculate_indicators


class IndicatorsService:
    """指标计算服务"""

    def __init__(self):
        """初始化服务"""
        self.binance_client = BinanceDataClient()

    def get_indicators(
        self,
        symbol: str,
        interval: str,
        hours: int = 24
    ) -> Dict[str, Any]:
        """
        获取技术指标数据

        Args:
            symbol: 交易对符号，如 'ETHUSDT'
            interval: 时间间隔 ('3m', '4h')
            hours: 获取多少小时的数据

        Returns:
            包含技术指标的字典
        """
        # 验证交易对
        if not self.binance_client.validate_symbol(symbol):
            raise ValueError(f"交易对 '{symbol}' 不存在")

        # 验证时间间隔
        if interval not in ['3m', '4h']:
            raise ValueError("时间间隔必须是 '3m' 或 '4h'")

        # 计算需要获取的数据数量
        if interval == '3m':
            # 3 分钟间隔，24 小时 = 480 条数据
            limit = min(hours * 20, 1500)  # 最多 1500 条（API 限制）
        else:
            # 4 小时间隔，24 小时 = 6 条数据
            limit = min(hours // 4, 1500)

        # 获取 K 线数据
        end_time = datetime.now()
        start_time = end_time - timedelta(hours=hours)

        klines = self.binance_client.get_klines(
            symbol=symbol,
            interval=interval,  # type: ignore
            start_time=start_time,
            end_time=end_time,
            limit=limit
        )

        if not klines:
            raise ValueError("未获取到 K 线数据")

        # 计算技术指标
        indicators = calculate_indicators(klines, interval)

        # 获取真实的期货数据（Open Interest 和 Funding Rate）
        # 注意：这些数据需要从 Binance 期货 API 获取
        if symbol.endswith('USDT'):
            try:
                # 获取期货数据
                futures_data = self.binance_client.get_futures_data(symbol)
                oi = futures_data['open_interest']
                fr = futures_data['funding_rate']

                # 添加真实的 Open Interest 数据
                indicators['open_interest'] = {
                    'latest': oi,
                    'average': oi  # 注意：真实 API 无法直接获取平均值，这里返回最新值
                }

                # 添加真实的 Funding Rate 数据
                indicators['funding_rate'] = {
                    'rate': fr
                }
            except Exception as e:
                # 如果期货数据获取失败，使用默认值
                indicators['open_interest'] = {
                    'latest': 0.0,
                    'average': 0.0
                }
                indicators['funding_rate'] = {
                    'rate': 0.0
                }

        return indicators

    def get_3m_indicators(self, symbol: str, hours: int = 24) -> Dict[str, Any]:
        """获取 3 分钟间隔的指标数据"""
        return self.get_indicators(symbol, '3m', hours)

    def get_4h_indicators(self, symbol: str, hours: int = 168) -> Dict[str, Any]:
        """获取 4 小时间隔的指标数据"""
        return self.get_indicators(symbol, '4h', hours)

    def get_3m_and_4h_indicators(self, symbol: str) -> Dict[str, Any]:
        """
        获取 3 分钟和 4 小时的技术指标数据

        Args:
            symbol: 交易对符号，如 'ETHUSDT'

        Returns:
            包含 3 分钟和 4 小时指标的字典
        """
        result = {
            'symbol': symbol,
            'timestamp': datetime.now().isoformat(),
            '3m_timeframe': self.get_3m_indicators(symbol, hours=24),
            '4h_timeframe': self.get_4h_indicators(symbol, hours=168)
        }

        return result
